# 几种更为复杂的代理：Structured Tool Chat（结构化工具对话）代理、Self-Ask with Search（自主询问搜索）代理、Plan and execute（计划与执行） 代理
# 结构化工具的示例包括：文件管理工具集：支持所有文件系统操作，如写入、搜索、移动、复制、列目录和查找。Web 浏览器工具集：官方的 PlayWright 浏览器工具包，允许代理访问网站、点击、提交表单和查询数据。
# Playwright 是一个开源的自动化框架，它可以让你模拟真实用户操作网页，帮助开发者和测试者自动化网页交互和测试。

# from playwright.sync_api import sync_playwright

# def run():
#     # 使用Playwright上下文管理器
#     with sync_playwright() as p:
#         # 使用Chromium，但你也可以选择firefox或webkit
#         browser = p.chromium.launch()
        
#         # 创建一个新的页面
#         page = browser.new_page()
        
#         # 导航到指定的URL
#         # page.goto('https://langchain.com/')
#         page.goto('https://bizhall.ancc.org.cn') # document.title
        
#         # 获取并打印页面标题
#         title = page.title()
#         print(f"Page title is: {title}")
        
#         # 关闭浏览器
#         browser.close()

# if __name__ == "__main__":
#     run()

from langchain_community.agent_toolkits.playwright.toolkit import PlayWrightBrowserToolkit
from langchain_community.tools.playwright.utils import create_async_playwright_browser
from langchain.schema import SystemMessage

async_browser = create_async_playwright_browser()
toolkit = PlayWrightBrowserToolkit.from_browser(async_browser=async_browser)

# ClickTool, NavigateTool GetElementTool ...
tools = toolkit.get_tools()


from langchain.agents import AgentType, initialize_agent
from langchain_ollama import ChatOllama

llm = ChatOllama(
    model="deepseek-r1:8b",
    base_url="http://localhost:11434",
    temperature=0.5,
    num_predict=512
)

system_message = SystemMessage(
    content="""你是一个专业的网页分析助手，可以使用PlayWright工具访问和分析网页内容。
重要指示：
1. 请严格按照用户的要求执行具体步骤：首先导航到指定网页，然后使用get_elements工具获取页面元素。
2. 必须使用工具来获取实时信息，不要依赖已有的知识。
3. 在调用工具后，详细分析工具返回的结果并提取关键信息。
4. 请在最终回答中明确列出页面标题和所有层级的标题元素(h1-h6)。
5. 思考过程和回答必须使用中文。
请确保你的操作步骤清晰，先导航，再提取元素，最后总结结果。"""
)

# 配置更详细的agent参数
agent_chain = initialize_agent(
    tools,
    llm,
    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    handle_parsing_errors=True,  # 更好的错误处理
    max_iterations=5,
    return_intermediate_steps=True,  # 返回中间步骤以查看思考过程
    agent_kwargs={
      "system_message": system_message.content
    },
    early_stopping_method="generate"
)

async def main():
    url = "https://bizhall.ancc.org.cn"
    
    try:
        # 优化问题提示词，使其更明确地指导Agent使用工具
        improved_question = f"网页 {url} 的 标题是什么？"
        # 使用ainvoke替代已弃用的arun方法
        result = await agent_chain.ainvoke({"input": improved_question})
        
        print(f"返回类型: {type(result)}")
        
    except Exception as e:
        print(f"\n=== 执行出错: {type(e).__name__} ===")

# 使用现代的异步执行方式
import asyncio
asyncio.run(main())
